package drawing.demo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.View;

public class Matrix2Draw extends View {  
    
    public Matrix2Draw(Context context) {  
        super(context);  
        initialize();  
    }  
    
    public Matrix2Draw(Context context, AttributeSet attrs) {
		super(context, attrs);
        initialize();  
	}
    
    public Matrix2Draw(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
        initialize();  
	}

	private Bitmap mBitmap;  
    private Matrix mMatrix = new Matrix();  
      


    private void initialize() {  
        Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.win7)).getBitmap();  
        mBitmap = bmp;  
        /*首先，将缩放为100*100。这里scale的参数是比例。有一点要注意，如果直接用100/ 
           bmp.getWidth()的话，会得到0，因为是整型相除，所以必须其中有一个是float型的， 
           直接用100f就好。*/  
        mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());  
        /*// post 方式：后乘 >> 当前的矩阵乘以参数给出的矩阵。可以连续多次使用post，来完成所需的整个变换。 
        //平移到（100，100）处 
        mMatrix.postTranslate(100, 100); 
        //倾斜x和y轴，以（100，100）为中心。 
        mMatrix.postSkew(0.2f, 0.2f, 100, 100);*/  
        // pre 方式：前乘 >> 参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。  
        //平移到（100，100）处  
        mMatrix.preTranslate(100, 100);  
        //倾斜x和y轴，以（100，100）为中心。  
        mMatrix.preSkew(0.2f, 0.2f, 100, 100);  
    }  
      
    @Override protected void onDraw(Canvas canvas) {  
//          super.onDraw(canvas);  //如果界面上还有其他元素需要绘制，只需要将这句话写上就行了。  
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
        canvas.drawBitmap(mBitmap, mMatrix, paint);  
    }  
}  
  
/** 
    Matrix的操作: 
  
    总共分为translate（平移），rotate（旋转），scale（缩放）和skew（倾斜）四种，每一种变换在 

    Android的API里都提供了set, post和pre三种操作方式,除了translate，其他三种操作都可以指定中心点。  

    set是直接设置Matrix的值，每次set一次，整个Matrix的数组都会变掉。  

    post是后乘，当前的矩阵乘以参数给出的矩阵。可以连续多次使用post，来完成所需的整个变换。 

    pre是前乘，参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。 
     
    旋转、缩放和倾斜都可以围绕一个中心点来进行，如果不指定，默认情况下，是围绕(0,0)点来进行。 
 */  